<?php

/**
 * Store_ActionsController
 * 
 * Модуль магазина, контроллер акций
 *  
 * @package   Store
 * @author    Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 * @copyright Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 */
 
class Store_ActionsController extends Lord_Controller_Action 
{   
	
/*------------------------------------------------------------------------------*/

    /**
     * Показывает список текущих акций
     */
     
    public function indexAction()
    {
        // достаем и показываем текущие акции
        $this->view->actions = $this->model->getCurrentActions();
           
        return;
    }

/*------------------------------------------------------------------------------*/

	/**
	 * Показывает список всех акций
	 */
	 
	public function listAction()
	{
        // достаем и показываем текущие акции
        $this->view->actions = $this->model->getAllActions();
		   
		return;
	}

/*------------------------------------------------------------------------------*/

    /**
    * Добавление акции
    */
    
    public function addAction()
    {    
        return $this->_process('add');
    }

/*------------------------------------------------------------------------------*/

	/**
	* Редактирование акции
	*/
	
	public function editAction()
	{    
        // достаем нужные данные
        $data = $this->model->getAction($this->_checkId())->toArray();
        
        // если в $data пусто - нам пытаются скормить что-то не то
        if(empty($data))
            return $this->view->err = 'store_actions_edit_fail';
		return $this->_process('edit', $data);
	}

/*------------------------------------------------------------------------------*/
 
	/**
	* Удаление акции
	*/
	
	function deleteAction()
	{
		// проверяем айдишник
		$id = $this->_checkId();
		
        // получаем акцию
        $this->view->action = $this->model->getAction($id);
                    
		if ($this->_request->isPost()) 
		{    
			// если юзер подтверждает - удаляем
			if ($this->_request->getPost('conf') == 'ok') 
			{
				$this->model->delAction($id);
			}
		} 
		else 
		{
			// если в $this->view->comment пусто - нам пытаются скормить левый $id
			if(empty($this->view->action))
				return $this->view->err = 'store_actions_delete_fail';
			else
				return;
		}
		// возвращаемся на главную страницу
		$this->_redirect('store/actions/list');
	}

/*==============================================================================*/

	/**
	* Приватный метод для проверки айдишника записи
	*/
	
	private function _checkId()
	{   
		$id = $this->_getParam('id');
		 
		if( $id == false
			or $id == null
			or empty($id)
			or !isset($id))
		{
			return $this->_redirect('');
		}
		else
		{
			return (int)$id;
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для обработки 
	* добавления и редактирования 
	* 
	* @param string $action
	* @param array $data
	* @return void
	*/

	private function _process($action = 'add', $data = array())
	{
		// показываем форму
		$form = $this->_form($data, array(), $action);
		$this->view->assign('form', $form); 
		 
		// валидация
		if (!empty($_POST)) 
		{
			if (!$form->isValid($_POST)) 
			{   
				// показываем сообщение об ошибке
				$this->view->err = 'form_fail';
				// получаем невалидные значения, введенные в форму         
				$values = $form->getUnfilteredValues();
				// получаем ошибки
				$errors = $form->getErrors(); 
				// показываем форму с невалидными данными
				return $this->view->form = $this->_form($values, $errors, $action);
			}
		}
		
		/**
		* обрабатываем форму
		*/
		// если к нам что-то пришло из поста
		if ($this->_request->isPost()) 
		{           
			// получаем корректные данные, введенные юзером
			$values = $form->getValues();
			
            // добавление комментария
            if($action == 'add')
            {    
                $data['name']      = $values['name'];
                $data['content']   = $values['ckeditor1'];
                $data['date_from'] = $values['date_from'];
                $data['date_to']   = $values['date_to'];
                
                // добавляем в базу
                $this->model->addAction($data);
                return $this->_redirect('/store/actions/list/');
            }
			// редактирование комментария
			if($action == 'edit')
			{
                $data['name']      = $values['name'];
                $data['content']   = $values['ckeditor1'];
                $data['date_from'] = $values['date_from'];
                $data['date_to']   = $values['date_to'];
                
				// изменяем 
				$this->model->updateAction($data, $this->_checkId());
                return $this->_redirect('/store/actions/list/');
			}
		}        
	}
	
/*------------------------------------------------------------------------------*/
	
	/**
	* Приватный метод для построения формы
	* В качестве аргумента принимает уже заполненые 
	* данные (при редактировании)
	* 
	* @param $data array 
	* @param $errors array
	* @param $action string
    * @param $id int
	* @return object
	*/
	
	private function _form($data   = array(), 
						   $errors = array(), 
						   $action = 'add')
	{
		// обратите внимание, форма создается на основе собственного класса. 
		$form = new Lord_Form_Form();
		$form->setAction(  '/' . $this->_moduleName
						 . '/' . $this->_controllerName
						 . '/' . $action );
		// кодировка	 
		$charset = $this->_helper->config()->common->charset;

		// Имя акции
		$name = new Lord_Form_Element_Text('name', array(
			'required'    => true,
			'label'       => $this->view->translate('store_actions_form_name'),
			'description' => $this->view->translate('store_actions_form_name_desc'),
			'maxlength'   => '250',
			'validators'  => array(
				array('StringLength', true, array(0, 250, $charset))
			),
			'value'       => (!empty($data['name'])) ? $data['name'] : ''
		));
		$form->addElement($name); 

        // Элемент "Дата начала акции". Элемент содержит нестандартный декоратор - javascript календарь
        $dateFrom = new Zend_Form_Element_Text('date_from', array(
            'required'    => true,
            'label'       => $this->view->translate('store_actions_form_date_from'),
            'description' => $this->view->translate('store_actions_form_date_from_desc'),
            'maxlength'   => '10',
            'validators'  => array(array('Date', true, array('yyyy-MM-dd'))),
            'filters'     => array('StringTrim'),
            'value'       => (!empty($data['date_from'])) ? $data['date_from'] : ''  
        ));
        $dateFrom->clearDecorators();
        $dateFrom
            ->addDecorator('ViewHelper')
            ->addDecorator('Calendar')
            ->addDecorator('Errors')            
            ->addDecorator('HtmlTag', array('tag' => 'dd'))
            ->addDecorator('Label', array('tag' => 'dt'));
        $form->addElement($dateFrom);    
        
        // Элемент "Дата окончания акции". Элемент содержит нестандартный декоратор - javascript календарь
        $dateTo = new Zend_Form_Element_Text('date_to', array(
            'required'    => true,
            'label'       => $this->view->translate('store_actions_form_date_to'),
            'description' => $this->view->translate('store_actions_form_date_to_desc'),
            'maxlength'   => '10',
            'validators'  => array(array('Date', true, array('yyyy-MM-dd'))),
            'filters'     => array('StringTrim'),
            'value'       => (!empty($data['date_to'])) ? $data['date_to'] : ''  
        ));
        $dateTo->clearDecorators();
        $dateTo
            ->addDecorator('ViewHelper')
            ->addDecorator('Calendar')
            ->addDecorator('Errors')            
            ->addDecorator('HtmlTag', array('tag' => 'dd'))
            ->addDecorator('Label', array('tag' => 'dt'));
        $form->addElement($dateTo);    
        
        // Textarea элемент Содержимого
        $content = new Zend_Form_Element_Textarea('ckeditor1', array(
            'label'       => $this->view->translate('store_actions_form_content'),
            'description' => $this->view->translate('store_actions_form_content_desc'),
            'required'    => true,
            'rows'        => '5',
            'cols'        => '47',
            'maxlength'   => '500',
            'validators'  => array(
                array('StringLength', true, array(0, 500, $charset))
             ),
            'filters'     => array('StringTrim'),
            'value'       => (!empty($data['content'])) ? $data['content'] : '' 
        ));
        $form->addElement($content);

		$id = $form->createElement('hidden', 'id')
			->setValue((!empty($data['id'])) ? $data['id'] : '' );
		$form->addElement($id);

		
		// кнопка сабмита
		$form->addElement('submit', 
						  'save', 
						  array('label' => $this->view->translate('store_actions_form_submit')));
                  
		// ошибки
		$this->_helper->FormErrors($errors, $form);

		// возвращаем форму
		return $form;
	}
	
/*------------------------------------------------------------------------------*/
}
